/**
 * 获取url参数
 */
const getUrlFn = (url) => {
  if (!url) {
    url = window.location.href
  }

  var param
  var theRequest = {}

  if (url.indexOf('?') !== -1) {
    var str = url.split('?')[1]
    var strs = str.split('&')

    for (var i = 0, len = strs.length; i < len; i++) {
      param = strs[i].split('=')
      theRequest[param[0]] = decodeURIComponent(param[1])
      // 把百分号还原回来
      if (theRequest[param[0]]) {
        theRequest[param[0]] = theRequest[param[0]].replace(/TRPercent/g, '%')
      }
    }
  }
  return theRequest
}


// 深拷贝
function deepCopy(obj) {
  if (obj === null) return obj;
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  if (typeof obj !== 'object') return obj;
  let cloneObj = new obj.constructor();
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      // 实现一个递归拷贝
      cloneObj[key] = this.deepCopy(obj[key]);
    }
  }
  return cloneObj;
}


/**
 * 获取当前时间前后N天的日期方法
 * @param {Number} AddDayCount 需要往前或推后的区间
 * @returns 年月日 yyyy-MM-dd
 */
function GettargeTime(AddDayCount, time = 'date') {
  var dd = new Date()
  if (time === 'date') {
    dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
    var y = dd.getFullYear()
    var m = (dd.getMonth() + 1) < 10 ? '0' + (dd.getMonth() + 1) : (dd.getMonth() + 1) // 获取当前月份的日期，不足10补0
    var d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号，不足10补0
    return y + '-' + m + '-' + d
  } else if (time === 'month') {
    dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
    var y = dd.getFullYear()
    var m = (dd.getMonth() + 1) < 10 ? '0' + (dd.getMonth() + 1) : (dd.getMonth() + 1) // 获取当前月份的日期，不足10补0
    return y + '-' + m
  }

}

/**
 * 日期格式化
 * @param {Number} targeTime 需要格式化的日期
 * @returns 年月日 yyyy-MM-dd
 */

function ParseDate(date) {
  var myyear = date.getFullYear()
  var mymonth = date.getMonth() + 1
  var myweekday = date.getDate()
  if (mymonth < 10) {
    mymonth = '0' + mymonth
  }
  if (myweekday < 10) {
    myweekday = '0' + myweekday
  }
  // console.log(date)
  return (myyear + '-' + mymonth + '-' + myweekday)
}

/**
 * 格式化数据
 * @typedef {string[]} data
 * @param {object[]} columns
 * @param {data[]} rawdata
 */
function fieldArrayToObject(columns = [], rawdata = []) {
  return columns.reduce((current, next, index) => ({ ...current, [next.code]: rawdata[index] }), {});
}

/**
 * 删除当前keepAlive组件的当前缓存
 * @param {*this} that 
 */
function delKeepaliveCache(that) {
  console.log(that.$vnode);
  if (that.$vnode && that.$vnode.data.keepAlive) {
    if (
      that.$vnode.parent &&
      that.$vnode.parent.componentInstance &&
      that.$vnode.parent.componentInstance.cache
    ) {
      // 当前的缓存对象
      const cache = that.$vnode.parent.componentInstance.cache;
      // 当前缓存对象的key的数组
      const keys = that.$vnode.parent.componentInstance.keys;
      // 当前页面的key值
      const key =
        that.$vnode.key == null
          ? that.$vnode.componentOptions.Ctor.cid +
          (that.$vnode.componentOptions.tag
            ? `::${that.$vnode.componentOptions.tag}`
            : "")
          : that.$vnode.key;
      // 销毁缓存
      if (cache[key]) {
        if (keys.length) {
          let index = key.indexOf(key);
          if (index > 0) {
            keys.splice(index, 1);
          }
        }
        delete cache[key];
      }

    }
  }
}

/**
 * 格式化地址，去除地球，中国
 * @param {String} value  地址中文名称
 * @returns 
 */
function formatAreaName(value) {
  if (!value) return
  const valArr = value.split("\\");
  if (valArr.includes("地球") || valArr.includes("中国")) {
    if (valArr.indexOf("地球") !== -1) {
      valArr.splice(valArr.indexOf("地球"), 1);
    }
    if (valArr.indexOf("中国") !== -1) {
      valArr.splice(valArr.indexOf("中国"), 1);
    }
    return valArr.toString().replace(/\,/g, "/");
  } else {
    return value;
  }
}

function dataURI2Blob(dataURI) {
  // 分割数据
  const [meta, data] = dataURI.split(',')
  // 对数据编码
  let byte
  if (meta.includes('base64')) {
    byte = atob(data)
  } else {
    byte = encodeURI(data)
  }

  // 获取图片格式
  const mime = meta.split(':')[1].split(';')[0]
  // 创建 8 位无符号整型数组
  const ia = new Uint8Array(byte.length)
  // 获取字符 UTF-16 编码值
  for (let i = 0; i < byte.length; i++) {
    ia[i] = byte.codePointAt(i)
  }
  // 生成类文件对象
  return new Blob([ia], { type: mime })
}

export {
  ParseDate,
  GettargeTime,
  deepCopy,
  getUrlFn,
  delKeepaliveCache,
  fieldArrayToObject,
  formatAreaName,
  dataURI2Blob
}